package com.insight.modules.system.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.insight.common.system.vo.SysDepartModel;
import com.insight.modules.system.entity.SysUserDepart;
import com.insight.modules.system.entity.SysUsers;
import com.insight.modules.system.model.DepartIdModel;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * <p>
 * SysUserDpeart用户组织机构service
 * </p>
 * @Author ZhiLin
 *
 */
/**
 * 用户部门关联服务接口，继承MyBatis-Plus IService，提供用户和部门之间关联操作
 */
public interface ISysUserDepartService extends IService<SysUserDepart> {

	/**
	 * 根据指定用户ID查询该用户所属的部门ID列表
	 *
	 * @param userId 用户ID
	 * @return 部门ID模型列表（包含部门ID及相关信息）
	 */
	List<DepartIdModel> queryDepartIdsOfUser(String userId);

	/**
	 * 根据部门ID查询该部门下的用户信息列表
	 *
	 * @param depId 部门ID
	 * @return 用户信息列表
	 */
	List<SysUsers> queryUserByDepId(String depId);

	/**
	 * 根据部门编码查询该部门及其所有下级部门的用户信息
	 *
	 * @param depCode  部门编码
	 * @param realname 用户真实姓名（可用于模糊查询）
	 * @param flag     标识参数（业务自定义含义）
	 * @return 用户信息列表
	 */
	List<SysUsers> queryUserByDepCode(String depCode, String realname, Integer flag);

	/**
	 * 根据用户ID更新其用户部门关联信息
	 *
	 * @param userId        用户ID
	 * @param sysUserDepart 用户部门关联实体（包含需更新字段）
	 * @return true 更新成功，false 更新失败
	 */
	Boolean updateByUId(String userId, SysUserDepart sysUserDepart);

	/**
	 * 根据部门编码及用户名等条件分页查询部门用户列表
	 *
	 * @param orgCode  部门编码
	 * @param username 用户名（支持模糊匹配）
	 * @param realname 真实姓名（支持模糊匹配）
	 * @param pageNo   当前页码
	 * @param pageSize 每页大小
	 * @return 分页用户信息结果
	 */
	IPage<SysUsers> queryUserByDepCodeWithPage(String orgCode, String username, String realname, Integer pageNo, Integer pageSize);

	/**
	 * 分页查询指定部门ID下的用户列表
	 *
	 * @param departId 部门ID
	 * @param username 用户名（可选，支持模糊匹配）
	 * @param realname 真实姓名（可选，支持模糊匹配）
	 * @param pageSize 每页大小
	 * @param pageNo   当前页码
	 * @param request  HttpServletRequest，用于提取额外查询参数
	 * @return 分页用户信息
	 */
	IPage<SysUsers> queryDepartUserPageList(String departId, String username, String realname, Integer pageSize, Integer pageNo, HttpServletRequest request);

	/**
	 * 根据用户名查询该用户所属部门的模型列表（用于批量申请等业务场景）
	 *
	 * @param batchApply 批量申请相关的用户名或参数
	 * @return 部门模型列表
	 */
	List<SysDepartModel> queryDepartsByUsername(String batchApply);
}

